const { Router } = require( 'express' )
// const mysql = require( 'mysql' )
const db = require( './../db/dbconfig' )
const upload = require( "./../db/uploadconfig" );   // 引用文件上传的对象
const userRouter = Router()

module.exports = userRouter;

/* userRouter.route( "/login" ).post( ( req, res ) => {
  const { username, password } = req.body;

  //  判断账号，密码

  if ( !username || !password ) {
    // res.json(
    //   {
    //     code: 4001,
    //     msg: '账号密码不能为空。'
    //   }
    // )
    res.redirect( "/index.html" )
    return //结束函数的执行，后面操作数据库的代码，将不执行。
  }
  // 写SQL语句时，不能直接用变量去拼接SQL字符串。只能用?占位。避免sql注入的安全问题发生。
  const sql = 'select * from users where uaccess = ? and upassword = ?;'
  const params = [ username, password ]  // params数组元素，必须与？的具体功能匹配。
  const cb = ( err, data ) => {
    // err,当执行SQL发生错误时，err的值就不是null.
    // data,查询成功后的结果。 []的形式展示。
    // console.log( err )
    // console.log( data )
    if ( err === null && data.length === 1 ) {
      res.redirect( "/pages/main.html" )
    } else {
      res.redirect( "/index.html" )
    }
  }

  // 操作数据课的步骤：
  // 1. 创建一个链接对象
  const conn = mysql.createConnection( {
    host: '127.0.0.1',  //要访问的目标数据库所在电脑的IP地址，'127.0.0.1'， 'localhost', '192.168.1.161'
    port: 3306,  // 默认是3306，安装时要是更改了端口，这写改后的端口号。
    user: 'root',  // 不是电脑的开机密码
    password: '1234',  // 是安装MYSQL时，设置的密码
    database: 'mydoctor', // 操作的那个具体的数据库的名字
    multipleStatements: true, // 支持执行多条 sql 语句
    timezone: '08:00' // 设置时区,如果不匹配，就可能有时差
  } )

  conn.connect()  // 2.打开链接
  conn.query( sql, params, cb ) // 3. 执行sql
  conn.end() //4.关闭链接

} ) */

// /index.html -> /login  -> /index.html

/**
 * @method 'POST'  此接口的请求方法
 * @param {String} username ，用户名 requied
 * @param {String} password, 密码 requied
 */
userRouter.route( "/login" ).post( ( req, res ) => {
  const { username, password } = req.body;
  //  判断账号，密码
  if ( !/^\w{6,20}$/.test( username ) ) {
    res.json( { code: 4001, msg: '账号不能为空或者长度不正确！' } )
    return
  }
  //  判断密码
  if ( !/^\w{6,8}$/.test( password ) ) {
    res.json( { code: 4002, msg: '密码不能为空或者长度不正确！' } )
    return
  }
  const sql = 'select * from users where uaccess = ? and upassword = ? and ustate = 1;'
  const params = [ username, password ]
  const cb = ( err, data ) => {
    console.log( err )
    console.log( data )
    if ( err === null && data.length === 1 ) {
      res.json( {
        code: 0, // 请求成功时
        msg: '登录成功',
        data: data
      } )
    } else {
      res.json( { code: 4003, msg: '登录失败', data: [] } )
    }
  }

  // 操作数据课的步骤：
  // 1. 创建一个链接对象
  /* const conn = mysql.createConnection( {
    host: '127.0.0.1',  //要访问的目标数据库所在电脑的IP地址，'127.0.0.1'， 'localhost', '192.168.1.161'
    port: 3306,  // 默认是3306，安装时要是更改了端口，这写改后的端口号。
    user: 'root',  // 不是电脑的开机密码
    password: '1234',  // 是安装MYSQL时，设置的密码
    database: 'mydoctor', // 操作的那个具体的数据库的名字
    multipleStatements: true, // 支持执行多条 sql 语句
    timezone: '08:00' // 设置时区,如果不匹配，就可能有时差
  } )

  conn.connect()  // 2.打开链接
  conn.query( sql, params, cb ) // 3. 执行sql
  conn.end() //4.关闭链接 
  */

  db.connect( sql, params, cb )
} )


userRouter.route( "/access/getAccess" )
  .get( ( req, res ) => {
    let sql = "select * from permissions;"
    let params = [];
    let cb = ( err, data ) => {
      if ( !err ) {   //err === null
        res.json( { code: 0, msg: '查询成功', data } )
      } else {
        res.json( { code: 4003, msg: '查询失败', data: [] } )
      }
    }

    db.connect( sql, params, cb );
  } )


// 搜索权限数据

userRouter.route( '/access/find' ).get( ( req, res ) => {
  let text = req.query.text;

  // let sql = `select * from permissions where pname = ?;`; // 等值判断
  // let params = [ text  ]
  let sql = `select * from permissions where pname like ?;`;  // 模糊查询
  let params = [ '%' + text + '%' ]
  let cb = ( err, data ) => {
    if ( !err ) {
      res.json( {
        code: 0, msg: '查询成功', data
      } )
    } else {
      res.json( {
        code: 0, msg: '查询失败', data
      } )
    }
  }

  db.connect( sql, params, cb )
} )

/**
 * 删除一个权限
 * @param {number} acid
 */
userRouter.route( "/access/delAccess" ).post( ( req, res ) => {
  const { acid } = req.body;
  if ( !acid ) {
    res.json( { code: 4005, msg: '缺少acid参数的值' } )
    return;
  }

  let sql = 'delete from permissions where  pid = ?;';
  let params = [ acid ]
  let cb = ( err, data ) => {
    console.log( err );
    console.log( data )
    //{
    //   fieldCount: 0,
    //   affectedRows: 1,  // 删除了几行
    //   insertId: 0,
    //   serverStatus: 2,
    //   warningCount: 0,
    //   message: '',
    //   protocol41: true,
    //   changedRows: 0
    // }
    if ( !err && data.effectedRows !== 0 ) {
      res.json( { code: 0, msg: '删除权限成功' } )
    } else {
      res.json( { code: 4001, msg: '删除权限失败' } )
    }
  }

  db.connect( sql, params, cb )

} )

/**
 * 添加权限
 * @param {String} pname
 * @param {String} pdes
 *
 */
userRouter.route( "/access/add" ).post( ( req, res ) => {
  const { pname, pdes } = req.body;
  let sql = 'insert into permissions (pname, pdes) values (?,?);';
  let params = [ pname, pdes ];

  let cb = ( err, data ) => {
    console.log( err )
    console.log( data );
    /*
     {
  fieldCount: 0,
  affectedRows: 1,  //插入几条
  insertId: 20,   // 插入这行数据的自增长ID。
  serverStatus: 2,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0
}
     */
    if ( err === null && data.affectedRows !== 0 ) {
      res.json( { code: 0, msg: '添加成功' } )
    } else {
      res.json( { code: 4001, msg: '添加失败' } )
    }
  }

  db.connect( sql, params, cb )
} )


// 后端分页，查询用户列表数据

userRouter.route( '/user/getAll' )
  .get( ( req, res ) => {
    let { pageNow, pageSize } = req.query;

    // 可以做一个判断
    if ( !pageNow && !pageSize ) {
      // 返回所有数据，让前端自己分页去~~~
      let sql = "select * from users;";
      let cb = ( err, data ) => {
        if ( !err ) {
          res.json( { code: 0, msg: "查询所有用户成功", data } );
        } else {
          res.json( { code: 4002, msg: "查询所有用户失败", data } );
        }
      };
      db.connect( sql, [], cb );
    } else {
      // 后端分页：
      let sql = "select * from users limit ?,?;"
      let startIndex;
      startIndex = ( pageNow - 1 ) * pageSize;
      pageSize = Number( pageSize );
      sql += "select count(*) as count from users;";

      let params = [ startIndex, pageSize ];
      let cb = ( err, data ) => {
        // console.log( err );
        // console.log( data );

        //二维数组： [[第一条SQL的查询结果],[[第2条SQL的查询结果],[]，。。。]
        if ( err === null ) {
          res.json( { code: 0, msg: "查询成功", data: data[ 0 ], count: data[ 1 ][ 0 ].count } );
        } else {
          res.json( { code: 4001, msg: "查询失败" } );
        }
      }
      db.connect( sql, params, cb );
      /* 
            // 二维数组：
            let arr = [ 1, 2, 2 ]
            let arr2 = [
              [ 1, 2, 32 ],  // arr2[0]
              [ 2, 3, 34 ]  // arr2[1]
            ]
            let arr3 = [
              [
                [ 2, 2, 3 ],
                [ 3, 4, 5 ],  // 4  ==> arr3[0][1][1]
                [ 3, 4, 4 ]
              ],
              [ 2, 3, 34 ]
            ]
      
            // let t = arr2[ 0 ];
            // t[0]  ==>  1
            // t[1]  ==>  2
      
            arr2[ 0 ][ 0 ]  // arr[行][列]    1
            arr2[ 0 ][ 1 ]// arr[行][列]  2
      
            // 34 ==》 arr2[1][2]  用双下标来表示一个元素。
       */
    }

  } )

// 文件上传，既可以单独只上传文件，也可以和表单数据一起上传。
// https://github.com/expressjs/multer/blob/master/doc/README-zh-cn.md


// 修改用户信息接口
userRouter.route( "/user/modifyUserInfo" )
  // single（参数名）,只接受单文件上传
  .post( upload.single( 'uphoto' ), ( req, res ) => {
    console.log( req.file )  // 单文件上传时使用  
    /*
    {
  fieldname: 'uphoto',
  originalname: 'panda2.webp',
  encoding: '7bit',
  mimetype: 'image/webp',
  destination: './public/uploads',
  filename: 'panda_1665219938624.webp',
  path: 'public\\uploads\\panda_1665219938624.webp',
  size: 10780
}
    */
    const { uname, upassword, usex, usid, utel, uid } = req.body;
    if ( !uid ) {
      res.json( { code: 4003, msg: 'uid是必须要传的' } )
      return;
    }
    let uphoto = ""; // 存储上传文件的名字？
    if ( req.file !== undefined ) { // 判断有没有上传文件
      uphoto = req.file.filename
    }

    let sql = `update users set uname = ?, upassword = ?,usex =?,utel=?,usid=? ${ uphoto !== "" ? ',uphoto = ?' : '' }  where uid = ?;`;
    let params = [ uname, upassword, usex, utel, usid ];
    uphoto !== "" ? params.push( uphoto ) : ""; // 如果有上传文件，就添加文件名称到pramas中。
    params.push( uid );

    let cb = ( err, data ) => {
      console.log( err );
      console.log( data );
      if ( err === null ) {
        res.json( { code: 0, msg: '更新成功' } )
      } else {
        res.json( { code: 4001, msg: '更新失败' } )
      }
    }
    db.connect( sql, params, cb );

  } );

// 修改用户的状态的接口：
/**
 * @param {String} ustate, 用户状态,required
 * @param {Number} uid , 用户ID， required
 */
userRouter.route( "/user/changeState" ) // /模块名/接口名
  // resetful接口规范。
  .post( ( req, res ) => {
    const { ustate, uid } = req.body;
    if ( !ustate || !uid ) {
      res.json( { code: 4001, msg: 'uid, ustate是必须的' } );
      return;
    }

    let sql = "update users set ustate = ? where uid = ?;";
    let params = [ ustate, uid ];
    let cb = ( err, data ) => {
      console.log( err )
      if ( err === null ) {
        res.json( { code: 0, msg: '更新成功' } );

      } else {
        res.json( { code: 4003, msg: '更新失败' } );
      }
    };
    db.connect( sql, params, cb )
  } )

// 删除用户
/**
 * @param {Number} uid, 用户id ,required
 */
/* userRouter.route( "/user/delete" )
  .post( ( req, res ) => {
    let uid = req.body.uid;
    // console.log( uid );
    let sql = `delete from users where uid = ?;`;
    let params = [ Number( uid ) ];
    let cb = ( err, data ) => {
      console.log( err )
      if ( err === null ) {
        res.json( { code: 0, msg: '删除用户成功' } )
      } else {
        res.json( { code: 4001, msg: '删除用户失败' } )

      }
    }
    db.connect( sql, params, cb );

  } ) */

// 使用Promise来写接口：
userRouter.route( "/user/delete" )
  .post( ( req, res ) => {
    let p = new Promise( ( resolve, reject ) => {
      let uid = req.body.uid;
      if ( !uid ) {
        reject( { code: 4001, msg: 'uid时必须传的参数' } )
        // console.log( "------------------------======" )
        return;
      }

      let sql = `delete from users where uid = ?;`;
      let params = [ Number( uid ) ];
      let cb = ( err, data ) => {
        console.log( err )
        if ( err === null ) {
          resolve( { code: 0, msg: '删除用户成功' } )
        } else {
          reject( { code: 4001, msg: '删除用户失败' } )
        }
      }
      db.connect( sql, params, cb );
    } )

    p.then( ( value ) => {
      res.json( value )
    } )
      .catch( value => {
        res.json( value )
      } )
  } )